#include"Ringqueue.hpp"
#include"Task.hpp"
#include<pthread.h>
#include<unistd.h>
#include<ctime>

//我们不清楚生产者和消费者谁先被调度（这是由调度器决定的），但是通过PV操作可知，一定是生产者先跑，因为如果没有
//数据资源，消费者要被阻塞的（通过sem_wait）
void* Productor(void* args)
{
    Ringqueue<Task>* rq=static_cast<Ringqueue<Task>*>(args);
    int cnt=100;
    while(true)
    {

         // 1.有数据
        int data1 = rand() % 10;
        usleep(1000); // 为了防止生成的数更加随机，所以休眠一会
        int data2 = rand() % 10;

        char oper = opers[rand() % (opers.size())];
        Task t(data1, data2, oper);
        // for debug
        string task_string = t.Printtask();
        cout << "productor    task;   " << task_string << endl;

        rq->Push(t);
        sleep(1);//让生产者慢一点

    }
}

void* Consumer(void* args)
{
    Ringqueue<Task>* rq=static_cast<Ringqueue<Task>*>(args);
    while(true)
    {
        Task t;
        rq->Pop(&t);

        t.Run();
        cout << "consumer data:    " << t.Printresult() << endl;
        //sleep(1);
    }
}

int main()
{
    srand((uint64_t)time(nullptr)^pthread_self());
    pthread_t c,p;

    //Ringqueue<int>* rq=new Ringqueue<int>();
    Ringqueue<Task>* rq=new Ringqueue<Task>();

    pthread_create(&p,nullptr,Productor,rq);
    pthread_create(&c,nullptr,Consumer,rq);

    pthread_join(p,nullptr);
    pthread_join(c,nullptr);
    return 0;
}